home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / menu.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  6KB  |  336 lines

  1. /* --------------------------------- menu.c --------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Menu management.
  8. */
  9.  
  10. #include "fly.h"
  11.  
  12.  
  13. char    FAR menuch[] = "0123456789abcdefghijklmnopqrstuvwxyz";
  14.  
  15. #define NMENUS    10
  16. static struct {
  17.     MENU    *menu;
  18.     int    selected;
  19. }    menus[NMENUS] = {{0}};
  20.  
  21. static int    nmenu = 0;
  22.  
  23. LOCAL_FUNC void NEAR
  24. oops (void)
  25. {
  26.     if (st.quiet)
  27.         Snd->Effect (EFF_BEEP, SND_ON);
  28. }
  29.  
  30. extern int FAR
  31. menu_open (MENU *menu, int selected)
  32. {
  33.     int    n, ch, c, ret, l;
  34.  
  35.     if (NMENUS == nmenu)
  36.         return (MENU_FAILED);        /* open failed */
  37.  
  38.     for (l = 0; menu[l].letter; ++l)
  39.         ;
  40.     menus[nmenu++].menu = menu;
  41.     for (ret = 0; !ret;) {
  42.         menus[nmenu-1].selected = selected;
  43.  
  44.         switch (ch = mgetch ()) {
  45.         case KF_ESC:            /* user ABORTEDed */
  46.             selected = MENU_ABORTED;
  47.             ret = 1;
  48.             break;
  49.         case K_ENTER:            /* confirm selection */
  50.             ret = 1;
  51.             break;
  52.         case K_UP:            /* prev option */
  53.         case K_LEFT:
  54.             if (selected > 0)
  55.                 --selected;
  56.             else
  57.                 oops ();
  58.             break;
  59.         case K_DOWN:            /* next option */
  60.         case K_RIGHT:
  61.             ++selected;
  62.             if (!menu[selected].letter) {
  63.                 --selected;
  64.                 oops ();
  65.             }
  66.             break;
  67.         case K_PGUP:            /* first option */
  68.             selected = 0;
  69.             break;
  70.         case K_PGDN:            /* last option */
  71.             while (menu[selected].letter)
  72.                 ++selected;
  73.             --selected;
  74.             break;
  75.         case K_F1|K_CTRL:
  76.         case K_F2|K_CTRL:
  77.         case K_F3|K_CTRL:
  78.         case K_F4|K_CTRL:
  79.         case K_F5|K_CTRL:
  80.         case K_F6|K_CTRL:
  81.         case K_F7|K_CTRL:
  82.         case K_F8|K_CTRL:
  83.         case K_F9|K_CTRL:
  84.         case K_F10|K_CTRL:
  85.             selected = ch - (K_F1|K_CTRL);
  86.             if (selected > l) {
  87.                 selected = 0;
  88.                 oops ();
  89.             }
  90.             ret = 1;
  91.             break;
  92.         case K_F1|K_ALT:
  93.         case K_F2|K_ALT:
  94.         case K_F3|K_ALT:
  95.         case K_F4|K_ALT:
  96.         case K_F5|K_ALT:
  97.         case K_F6|K_ALT:
  98.         case K_F7|K_ALT:
  99.         case K_F8|K_ALT:
  100.         case K_F9|K_ALT:
  101.         case K_F10|K_ALT:
  102.             selected = ch - (K_F1|K_ALT) + 10;
  103.             if (selected > l) {
  104.                 selected = 0;
  105.                 oops ();
  106.             }
  107.             ret = 1;
  108.             break;
  109.         default:            /* letter option */
  110.             for (n = 0; T(c = menu[n].letter) && c != ch; ++n)
  111.                 ;
  112.             if (c) {
  113.                 selected = n;
  114.                 ret = 1;
  115.             } else
  116.                 oops ();
  117.             break;
  118.         }
  119.     }
  120.  
  121.     menus[nmenu-1].selected = selected;
  122.     return (selected);
  123. }
  124.  
  125. extern void FAR
  126. menu_close (void)
  127. {
  128.     --nmenu;
  129. }
  130.  
  131. LOCAL_FUNC void NEAR
  132. show_option (int x, int y, int letter, char *text, int bss, Uint color)
  133. {
  134.     x += stroke_char (x, y, letter, bss, color);
  135.     x += stroke_char (x, y, ' ', bss, color);
  136.     x += stroke_str (x, y, text, bss, color);
  137. }
  138.  
  139. #define    NHDDMENU    10
  140.  
  141. extern int FAR
  142. hdd_menu (VIEW *view, int orgx, int orgy, int maxx, int maxy)
  143. {
  144.     int    ss, x, y, dx, dy, n, i, font, sel, color;
  145.     MENU    *m;
  146.  
  147.     if (!nmenu)
  148.         return (1);
  149.  
  150.     font = font_set (0);
  151.  
  152.     ss = maxx/12;
  153.     if (ss > 128)
  154.         ss = 128;
  155.     else if (ss < 8)
  156.         ss = 8;
  157.  
  158.     dy = maxy / (NHDDMENU/2);
  159.     if (dy < ss)
  160.         dy = ss;
  161.  
  162.     dx = stroke_size ("A", ss);
  163.  
  164.     x = orgx - maxx;
  165.     y = orgy - maxy;
  166.  
  167.     m = menus[nmenu-1].menu;
  168.     sel = menus[nmenu-1].selected;
  169.     for (n = 0; m[n].letter; ++n) {
  170.         color = (n == sel) ? ST_MENUH : ST_MENU;
  171.         if (NHDDMENU == n) {
  172.             x = orgx+maxx-dx;
  173.             y = orgy - maxy;
  174.         }
  175.         y += dy;
  176.         if (n >= NHDDMENU) {
  177.             i = n - NHDDMENU + 1;
  178.             if (i >= 10)
  179.                 i -= 10;
  180.             stroke_char (x, y, '0'+i, ss, color);
  181.             stroke_str  (orgx, y, m[n].text, ss, color);
  182.         } else {
  183.             i = n + 1;
  184.             if (i >= 10)
  185.                 i -= 10;
  186.             stroke_char (x, y, '0'+i, ss, color);
  187.             stroke_str  (x+dx*2, y, m[n].text, ss, color);
  188.         }
  189.     }
  190.     font = font_set (font);
  191.     return (0);
  192. }
  193.  
  194. extern void FAR
  195. show_menu (VIEW *view, int orgx, int orgy, int maxx, int maxy, int bss)
  196. {
  197.     int    x, y, x0, y0, dx, dy, i, n, color;
  198.     MENU    *m;
  199.  
  200.     if (!nmenu)
  201.         return;
  202.  
  203.     dx = dy = bss;
  204.  
  205.     x0 = orgx - maxx;
  206.     y0 = orgy - maxy;
  207.  
  208.     x = x0 + dx;
  209.     y = y0 + dy;
  210.     for (i = 0;; ++i) {
  211.         m = menus[i].menu;
  212.         if (i < nmenu-1) {
  213.             n = menus[i].selected;
  214.             color = ST_MENUH;
  215.             y += dy;
  216.             show_option (x, y, m[n].letter, m[n].text, dx, color);
  217.             x += 2*dx;
  218.             continue;
  219.         }
  220.         for (n = 0; m[n].letter; ++n) {
  221.             color = (n == menus[i].selected) ? ST_MENUH : ST_MENU;
  222.             y += dy;
  223.             show_option (x, y, m[n].letter, m[n].text, dx, color);
  224.         }
  225.         break;
  226.     }
  227. }
  228.  
  229. static MENU MenuNum[] = {
  230.     {'+', "Increase"},    /*  0 */
  231.     {'-', "Decrease"},    /*  1 */
  232.     {'=', "New"},        /*  2 */
  233.     {'*', "Restore"},    /*  3 */
  234. {'\0', 0}};
  235.  
  236. extern void FAR
  237. get_num (char *name, void *value, int type, long vmin, long vmax, long vinc)
  238. {
  239.     int    sel;
  240.     long    l, vold, vnew;
  241.     char    in[16], msg[80];
  242.     HMSG    *m;
  243.  
  244.     if (MT_CHAR == type)
  245.         vold = *(char *)value;
  246.     else if (MT_SHORT == type)
  247.         vold = *(short *)value;
  248.     else if (MT_INT == type)
  249.         vold = *(int *)value;
  250.     else if (MT_LONG == type)
  251.         vold = *(long *)value;
  252.     else {
  253.         MsgEPrintf (50, "get_num> Bad type");
  254.         return;
  255.     }
  256.     vnew = vold;
  257.  
  258.     sprintf (msg, "%s %9ld", name, vnew);
  259.     m = MsgWPrintf (0, msg);
  260.  
  261.     sel = 3;
  262.     do {
  263.         if (m)
  264.             sprintf (m->text, "%s %9ld", name, vnew);
  265.  
  266.         sel = menu_open (MenuNum, sel);
  267.         switch (sel) {
  268.         default:
  269.         case MENU_ABORTED:
  270.         case MENU_FAILED:
  271.             break;
  272.         case 0:
  273.             vnew += vinc;
  274.             if (vnew > vmax)
  275.                 vnew = vmax;
  276.             break;
  277.         case 1:
  278.             vnew -= vinc;
  279.             if (vnew < vmin)
  280.                 vnew = vmin;
  281.             break;
  282.         case 2:
  283.             sprintf (msg, "%s from %ld to %ld", name, vmin, vmax);
  284.             sprintf (in, "%ld", vnew);
  285.             edit_str (msg, in, sizeof (in));
  286.             if (1 == sscanf (in, "%ld", &l) &&
  287.                 l <= vmax && l >= vmin)
  288.                 vnew = l;
  289.             else
  290.                 MsgEPrintf (50, "Bad value");
  291.             break;
  292.         case 3:
  293.             vnew = vold;
  294.             break;
  295.         }
  296.         if (MENU_FAILED != sel)
  297.             menu_close ();
  298.  
  299.         if (MT_CHAR == type)
  300.             *(char *)value = (char)vnew;
  301.         else if (MT_SHORT == type)
  302.             *(short *)value = (short)vnew;
  303.         else if (MT_INT == type)
  304.             *(int *)value = (int)vnew;
  305.         else if (MT_LONG == type)
  306.             *(long *)value = vnew;
  307.     } while (sel >= 0);
  308.  
  309.     msg_del (m);
  310. }
  311.  
  312. extern void FAR
  313. SetOption (Ushort *i, Ushort mask)
  314. {
  315.     static int    mode = 2;
  316.  
  317.     if (0 == i) {
  318.         mode = mask;
  319.         return;
  320.     }
  321.     switch (mode) {
  322.     case 0:
  323.         *i &= ~mask;
  324.         break;
  325.     case 1:
  326.         *i |= mask;
  327.         break;
  328.     case 2:
  329.         *i ^= mask;
  330.         break;
  331.     }
  332. }
  333.  
  334. #undef NHDDMENU
  335. #undef NMENUS
  336.